# -*- coding: utf-8 -*-
'''
初始条件：
    节点A：
        输入信号：
            α：80
            β：20
    节点C：
        输入信号：
            α：50
            β：80
节点A(混合节点)：
    输入信号：α、β
    输出信号：(α+β)/2
节点B(时移节点)：
    输入信号：节点A的输出信号
    输出信号：输入信号右移2s
节点C(换热节点):
    输入信号：α:=80、β
    输出信号：β ? α-0.9(α-β) : α
    解释：
        这里假定热损系数为 0.9
        经过换热后，热水损失温差的30％的热量，换热过程是瞬间完成的，且不考虑导热率，所以说不符合实际的传热学定律
问：
    节点B的输出信号能否达到稳态？求稳态数值
流程图：
    β ───────────┐
                 ├─── A ─── B ───┬─── output
    α ──── C ────┘               │
           └─────────────────────┘
'''

STEP = 0.1  # 时间步长
TIME_SHIFT = 2  # 时移节点的延时，模拟水流在管道中走过的时间

PIPE_MAX_LENGTH = int(TIME_SHIFT / STEP)
PIPE = [50]*PIPE_MAX_LENGTH

HEAT_LOSS_RATIO = 0.1  # 热损系数

results = []


def A(a, b):
    return (a+b)/2


def B(x):
    PIPE.append(x)
    return PIPE.pop(0)


def C(a, b=80):
    return b - HEAT_LOSS_RATIO*(b-a)


def loop(time):
    steps = time / STEP
    a = 80
    while steps > 0:
        output = B(A(a, 20))
        results.append(output)
        a = C(output)
        steps -= 1


if __name__ == '__main__':
    compute_time = 30
    loop(compute_time)

    import matplotlib.pyplot as plt
    plt.figure(figsize=(4, 3))
    calculate_range = [x*0.1 for x in range(int(compute_time/STEP))]
    # xrange = filter(lambda x: x, calculate_range)
    # plt.axis(xrange)
    plt.plot(calculate_range, results)
    plt.show()
